#include<iostream>
#include<unistd.h>
#include <fcntl.h>
#include <cstring>
using namespace std;


void SetNonBlock(int fd)
{
    int f1 = fcntl(fd, F_GETFL);  //使用F_GETFL将当前文件描述符的属性提取出来（这是一个位图）
    if(f1<0)
    {
        perror("fcntl");
        return ;
    }
    fcntl(fd, F_SETFL, f1 | O_NONBLOCK);    //将该文件状态多设置一个非阻塞，然后设置给fd

    cout<< " set "<< fd << "nonblock done"<<endl;
}


int main()
{
    char buffer[1024];
    SetNonBlock(0);

    while(true)
    {
        ssize_t n = read(0, buffer, sizeof(buffer)-1);
        if(n>0)
        {
            buffer[n-1] = 0;
            cout<<" echo: "<<buffer<<endl;
        }
        else if(n == 0)
        {
            cout<<"read done!"<<endl;
            break;
        }
        else
        {
            // 1.设置成非阻塞之后，如果底层fd数据没有就绪，recv/read/write/send，返回值会以出错的形式返回
            //2. a 真的出错   b.底层没有就绪
            // 3.怎么区分程序是真的出错了还是fd没有就绪呢？
            if(errno==EWOULDBLOCK)
            {
                cout<<"0 fd data not ready, try again!"<<endl;
                // do_other_thing();
                sleep(1);
            }
            else
            {
                cerr<<" read error, n = "<< n <<"errno code: "
                <<errno<<", error str"<<strerror(errno)<<endl;
            }
        }
    }


    return 0;
}

